{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# TensorFlow2 教程-卷积变分自编码器\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "本教程通过构建卷积变分自编码器生成手写数字图片\n",
    "\n",
    "首先先导入相关的库\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/doit/anaconda3/lib/python3.6/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n",
      "  from ._conv import register_converters as _register_converters\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.0.0\n"
     ]
    }
   ],
   "source": [
    "from __future__ import absolute_import, division, print_function, unicode_literals\n",
    "\n",
    "import tensorflow as tf\n",
    "\n",
    "import os\n",
    "import time\n",
    "import numpy as np\n",
    "import glob\n",
    "import matplotlib.pyplot as plt\n",
    "import PIL\n",
    "import imageio\n",
    "print(tf.__version__)\n",
    "from IPython import display"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 一、载入MNIST数据集"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "MNIST数据是手写数字识别的图像数据集，是经典的深度学习数据集。其中每个图片大小为28*28，即可用一个784维的向量来表示图片。其中向量的每个数值在0-255之间，表示像素强度。\n",
    "我们使用MNIST数据集来进行卷积变分自编码的实验，我们首先需要对图像数据进行预处理。这里我们使用伯努利分别来对所有像素进行建模，同时对数据集进行静态二值化处理。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "(train_images, _), (test_images, _) = tf.keras.datasets.mnist.load_data()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 构建数据集\n",
    "\n",
    "train_images = train_images.reshape(train_images.shape[0], 28, 28, 1).astype('float32')\n",
    "test_images = test_images.reshape(test_images.shape[0], 28, 28, 1).astype('float32')\n",
    "\n",
    "# 化到0-1之间\n",
    "train_images /= 255.0\n",
    "test_images /= 255.0\n",
    "\n",
    "# 二值化\n",
    "train_images[train_images>=0.5] = 1.0\n",
    "train_images[train_images<0.5] = 0.0\n",
    "test_images[test_images>=0.5] = 1.0\n",
    "test_images[test_images<0.5] = 0.0\n",
    "\n",
    "#　超参数\n",
    "ＴRAIN_BUF=60000\n",
    "BATCH_SIZE = 100\n",
    "TEST_BUF = 10000"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 分批和打乱数据\n",
    "\n",
    "\n",
    "train_dataset = tf.data.Dataset.from_tensor_slices(train_images).shuffle(TRAIN_BUF).batch(BATCH_SIZE)\n",
    "test_dataset = tf.data.Dataset.from_tensor_slices(test_images).shuffle(TEST_BUF).batch(BATCH_SIZE)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 二、构建生成网络和推理网络"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们使用卷积网络来构建生成网络和推理网络。并使用x和z分别表示观测值和潜在变量\n",
    "#### 生成网络\n",
    "生成网络将隐变量作为输入，并输出用于观测条件分布的参数p(x|z).我们对隐变量使用单位高斯先验分布。\n",
    "#### 推理网络\n",
    "这里定义了近似后验分布q(z|x) ，该后验分布以观测值作为输入，并输出用于潜在表示的条件分布的一组参数。在本示例中，我们仅将此分布建模为对角高斯模型。在这种情况下，推断网络将输出因式分解的高斯均值和对数方差参数\n",
    "#### 采样\n",
    "我们从q(z|x)中采样，方法是先从单位高斯中采样，然后乘以标注差并加上平均值。这样可以确保梯度能确保梯度能传回推理网络。\n",
    "#### 网络结构\n",
    "对于推理网络，我们使用了两个卷积层加一个全连接层，而对于生成网络，我们使用全连接层加3个反卷积层。\n",
    "注意：训练VAE过程中要避免使用批归一化，因为这样会导致额外的随机性，从而加剧随机抽样的不稳定性\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "class CVAE(tf.keras.Model):\n",
    "    def __init__(self, latent_dim):\n",
    "        super(CVAE, self).__init__()\n",
    "        self.latent_dim = latent_dim\n",
    "        self.inference_net = tf.keras.Sequential(\n",
    "        [\n",
    "            tf.keras.layers.InputLayer(input_shape=(28, 28, 1)),\n",
    "            tf.keras.layers.Conv2D(\n",
    "                filters=32, kernel_size=3, strides=(2, 2), activation='relu'),\n",
    "            tf.keras.layers.Conv2D(\n",
    "                filters=64, kernel_size=3, strides=(2, 2), activation='relu'),\n",
    "            tf.keras.layers.Flatten(),\n",
    "            tf.keras.layers.Dense(latent_dim+latent_dim)\n",
    "        ])\n",
    "        self.generative_net = tf.keras.Sequential(\n",
    "        [\n",
    "            tf.keras.layers.InputLayer(input_shape=(latent_dim,)),\n",
    "            tf.keras.layers.Dense(units=7*7*32, activation='relu'),\n",
    "            tf.keras.layers.Reshape(target_shape=(7, 7, 32)),\n",
    "            tf.keras.layers.Conv2DTranspose(\n",
    "                filters=64, kernel_size=3, strides=(2, 2),\n",
    "                padding='SAME', activation='relu'\n",
    "            ),\n",
    "            tf.keras.layers.Conv2DTranspose(\n",
    "                filters=32, kernel_size=3, strides=(2, 2),\n",
    "                padding='SAME', activation='relu'\n",
    "            ),\n",
    "            # 不使用激活函数\n",
    "            tf.keras.layers.Conv2DTranspose(\n",
    "                filters=1, kernel_size=3, strides=(1, 1),\n",
    "                padding='SAME'\n",
    "            ),\n",
    "            \n",
    "        ])\n",
    "    @tf.function\n",
    "    def sample(self, eps=None):\n",
    "        if eps is None:\n",
    "            eps = tf.random.normal(shape=(100, self.latent_dim))\n",
    "        return self.decode(eps, apply_sigmoid=True)\n",
    "    \n",
    "    def encode(self, x):\n",
    "        mean, logvar = tf.split(self.inference_net(x), num_or_size_splits=2,\n",
    "                               axis=1)\n",
    "        return mean, logvar\n",
    "    \n",
    "    def reparameterize(self, mean, logvar):\n",
    "        eps = tf.random.normal(shape=mean.shape)\n",
    "        return eps * tf.exp(logvar * 0.5) + mean\n",
    "    \n",
    "    def decode(self, z, apply_sigmoid=False):\n",
    "        logits = self.generative_net(z)\n",
    "        if apply_sigmoid:\n",
    "            probs = tf.sigmoid(logits)\n",
    "            return probs\n",
    "        return logits"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 三、定义损失函数和优化器\n",
    "\n",
    "VAE 通过最大化边际对数似然的证据下界（ELBO）进行训练：\n",
    "$\\log p(x) \\ge \\text{ELBO} = \\mathbb{E}_{q(z|x)}\\left[\\log \\frac{p(x, z)}{q(z|x)}\\right].$$\n",
    "\n",
    "实际上，我们优化了此期望的单样本蒙卡特罗估计：\n",
    "\n",
    "$$\\log p(x| z) + \\log p(z) - \\log q(z|x),$$\n",
    "其中 $z$ 从 $q(z|x)$ 中采样。\n",
    "\n",
    "注意：我们也可以分析性地计算 KL 项，但简单起见，这里我们将所有三个项合并到蒙卡特罗估计器中。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "optimizer = tf.keras.optimizers.Adam(1e-4)\n",
    "\n",
    "def log_normal_pdf(sample, mean, logvar, raxis=1):\n",
    "    log2pi = tf.math.log(2.0 * np.pi)\n",
    "    return tf.reduce_sum(\n",
    "    -0.5*((sample -mean)**2.0 * tf.exp(-logvar)+logvar+log2pi),\n",
    "        axis=raxis\n",
    "    )\n",
    "\n",
    "@tf.function\n",
    "def compute_loss(model, x):\n",
    "    mean, logvar = model.encode(x)\n",
    "    z = model.reparameterize(mean, logvar)\n",
    "    x_logit = model.decode(z)\n",
    "    \n",
    "    cross_ent = tf.nn.sigmoid_cross_entropy_with_logits(logits=x_logit, labels=x)\n",
    "    logpx_z = -tf.reduce_sum(cross_ent, axis=[1,2,3])\n",
    "    logpz = log_normal_pdf(z, 0.0, 0.0)\n",
    "    logpz_x = log_normal_pdf(z, mean, logvar)\n",
    "    return -tf.reduce_mean(logpx_z+logpz-logpz_x)\n",
    "\n",
    "@tf.function\n",
    "def compute_apply_gradients(model, x, optimizer):\n",
    "    with tf.GradientTape() as tape:\n",
    "        loss = compute_loss(model, x)\n",
    "    gradients = tape.gradient(loss, model.trainable_variables)\n",
    "    optimizer.apply_gradients(zip(gradients, model.trainable_variables))\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 四、训练\n",
    "我们从迭代数据集开始：\n",
    "- 在每次迭代期间，我们将图像传递给编码器，以获得近似后验q(z|x)  的一组均值和对数方差参数。\n",
    "- 然后，我们从 q(z|x) 中采样分布。\n",
    "\n",
    "- 最后，我们将重新参数化的样本传递给解码器，以获取生成分布 p(x|z) 的 logit。\n",
    "\n",
    "注意：由于我们使用的是由 keras 加载的数据集，其中训练集中有 6 万个数据点，测试集中有 1 万个数据点，因此我们在测试集上的最终 ELBO 略高于对 Larochelle 版 MNIST 使用动态二值化的文献中的报告结果。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 五、生成图片\n",
    "- 进行训练后，可以生成一些图片了\n",
    "- 我们首先从单位高斯先验分布 p(z) 中采样一组隐向量z\n",
    "- 随后生成器将隐向量z 转换为观测值的 logit，得到分布 p(x|z)\n",
    "- 这样我们就可以得到生成的图片"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "epochs = 100\n",
    "latent_dim = 50\n",
    "num_examples_to_generate = 16\n",
    "\n",
    "# 保持随机向量恒定以进行生成（预测），以便看到改进。\n",
    "random_vector_for_generation = tf.random.normal(\n",
    "    shape=[num_examples_to_generate, latent_dim])\n",
    "model = CVAE(latent_dim)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 使用输入生成图片\n",
    "def generate_and_save_images(model, epoch, test_input):\n",
    "    predictions = model.sample(test_input)\n",
    "    fig = plt.figure(figsize=(4,4))\n",
    "\n",
    "    for i in range(predictions.shape[0]):\n",
    "        plt.subplot(4, 4, i+1)\n",
    "        plt.imshow(predictions[i, :, :, 0], cmap='gray')\n",
    "        plt.axis('off')\n",
    "\n",
    "    # tight_layout 最小化两个子图之间的重叠\n",
    "    plt.savefig('image_at_epoch_{:04d}.png'.format(epoch))\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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Mz8rK8swk884zLVNmzZ2txjnL7/84tg4RB+E44EDBxyiCgIp//ieT8iCmOzSpYsk2X258cYb3Zma8NyBAwcMi3EhgL3Hjh0zQUdeQokSJfxyoVwhXRs1auREq379+kmKKgzcJs5eINz2zjvv+OUaMGBAYGXw0EMPRaToywf5ytyjRJOTk89pRipFFQR5JOQP8PdXXnmlScWZM2eKucSlJDyKQejQoYOVJq7ihg0bvG4k66E4MzIy/Nl9990XugmhhBJKMMlRZDBw4MCIFEUBEGPAXJI0pk+fbusIlFy0aJETUbBynF57zTXXGC1gYdPT033SENqY++zdu9fhJkjCRo0a2UKBQAjXtG3b1rA16Ak8tNVOT093j3yekRDpN998Y83PGhQrVuyco7+ZDymKhICZZFeuWbPGUBDEwf0mTJjgzEmszr/+9S8/B+4C1i0rK8suVdDTiTkHo3jx4p43kBDWcsGCBSZxQQg33HCDE61AdWRX7ty502PBTczOznaKLdYPonTDhg1GO7gVdevWNRnK94DczZo1M9QOGiqWpDFjxkSkaKgUa4u7wP6QYiFhEoziT8+GGAXVrF692i4ubvMnn3xiNAia5d347rvvnKrNWlWuXNmt/HFXuHe/fv08D0H2bogMQgklFEk5jAxIxtm3b5/9KMg5SI/4E4nRstOmTbM2BlHgk33//fcO2eBHJSQkmCTilCVQQNWqVZ3CCxG3f/9+XxfOAKJv0aJFTmYKigx69uwZkaInAeH748PiS/fp08dWmhTejz76yP4k6IVipj179lxw8EyzZs1sKUiWws8uUqSIST1+/vTTT0YSFDtxpuS3335rax7Ev5Skl19+OSJFD2fBsmOdGUf58uVtxeBNVqxYYeuHf0zy09tvv+3CHkJl9evX16RJkyTFkrZANJs3b/b6wD+lp6cbScBlsH82b95sS3vXXXcFRgaExStWrGh0wjUhRhs0aGDui7D4L7/8ck7dAc8gRVEN6If9V7FixXPWUIoh5NKlS5s/YB4KFy5s3gfymROW0tPTfe8gY/2fEIgHDx40tOIFhtT56aef/CLEH3lN7QAvN5N34sQJn7YEDJs1a5YJQOA+kYatW7f6e+TM85JJMeXEKU3t27f3gv373/++qAKe7OxsQ3Uyxtjor776qg90heS64oorzIhTY0AEoVKlSn7x458bt4Na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\n",
      "text/plain": [
       "<Figure size 288x288 with 16 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "generate_and_save_images(model, 0, random_vector_for_generation)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch: 100, Test set ELBO: -77.73490905761719, time elapse for current epoch 27.509661436080933\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 288x288 with 16 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "for epoch in range(1, epochs+1):\n",
    "    start_time = time.time()\n",
    "    for train_x in train_dataset:\n",
    "        compute_apply_gradients(model, train_x, optimizer)\n",
    "    end_time = time.time()\n",
    "    if epoch % 1 == 0:\n",
    "        loss = tf.keras.metrics.Mean()\n",
    "        for test_x in test_dataset:\n",
    "            loss(compute_loss(model, test_x))\n",
    "        elbo = -loss.result()\n",
    "        display.clear_output(wait=False)\n",
    "        print('Epoch: {}, Test set ELBO: {}, '\n",
    "          'time elapse for current epoch {}'.format(epoch,\n",
    "                                                    elbo,\n",
    "                                                    end_time - start_time))\n",
    "        generate_and_save_images(model, epoch, random_vector_for_generation)\n",
    "        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "### 五、生成图片\n",
    "def display_image(epoch_no):\n",
    "    return PIL.Image.open('image_at_epoch_{:04d}.png'.format(epoch_no))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(-0.5, 287.5, 287.5, -0.5)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.imshow(display_image(epochs))\n",
    "plt.axis('off')# 显示图片"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 生成gif\n",
    "anim_file = 'cvae.gif'\n",
    "with imageio.get_writer(anim_file, mode='I') as writer:\n",
    "    filenames = glob.glob('image*.png')\n",
    "    filenames = sorted(filenames)\n",
    "    last = -1\n",
    "    for i, filename in enumerate(filenames):\n",
    "        frame = 2*(i**0.5)\n",
    "        if round(frame) > round(last):\n",
    "            last = frame\n",
    "        else:\n",
    "            continue\n",
    "        image = imageio.imread(filename)\n",
    "        writer.append_data(image)\n",
    "    image = imageio.imread(filename)\n",
    "    writer.append_data(image)\n",
    "import IPython\n",
    "if IPython.version_info >= (6,2,0,''):\n",
    "    display.Image(filename=anim_file)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
